home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / 3d_tools / irit40s.lha / Irit / irit / bspline.irt < prev    next >
Encoding:
Text File  |  1993-12-30  |  6.7 KB  |  298 lines

  1. #
  2. # Some routines to test bspline curves/surfaces.
  3. #
  4.  
  5. #
  6. # Set display to on to view some results, off to view nothing.
  7. #
  8. display = on;
  9.  
  10. if ( machine == msdos, resolution = 5, resolution = 10 );
  11.  
  12. s45 = sin( pi / 4 );
  13. cbsp = list( ctlpt( P2, 1.0, 1.0, 0.0 ),
  14.          ctlpt( P2, s45, s45, s45 ),
  15.          ctlpt( P2, 1.0, 0.0, 1.0 ) );
  16. sbsp = list ( list( ctlpt( E3, 0.1, 0.0, 1.0 ),
  17.                 ctlpt( E3, 0.3, 1.0, 0.0 ),
  18.                 ctlpt( E3, 0.0, 2.0, 1.0 ) ),
  19.               list( ctlpt( E3, 1.1, 0.0, 0.0 ),
  20.                 ctlpt( E3, 1.3, 1.0, 2.0 ),
  21.                 ctlpt( E3, 1.0, 2.0, 0.0 ) ),
  22.               list( ctlpt( E3, 2.1, 0.0, 2.0 ),
  23.                 ctlpt( E3, 2.3, 1.0, 0.0 ),
  24.                 ctlpt( E3, 2.0, 2.0, 2.0 ) ),
  25.               list( ctlpt( E3, 3.1, 0.0, 0.0 ),
  26.                 ctlpt( E3, 3.3, 1.0, 2.0 ),
  27.                 ctlpt( E3, 3.0, 2.0, 0.0 ) ),
  28.               list( ctlpt( E3, 4.1, 0.0, 1.0 ),
  29.                 ctlpt( E3, 4.3, 1.0, 0.0 ),
  30.                 ctlpt( E3, 4.0, 2.0, 1.0 ) ) );
  31.  
  32. cb = cbspline( 3, cbsp, list( 0, 0, 0, 1, 1, 1 ) );
  33. color( cb, red );
  34. sb = sbspline( 3, 3, sbsp, list( list( 1, 1, 1, 2, 2, 2 ),
  35.                  list( 3, 3, 3, 4, 5, 6, 6, 6 ) ) );
  36. color( sb, red );
  37.  
  38. drawctlpt = 0;
  39. if ( display == on, interact( list( axes, cb, sb ) ) );
  40. drawctlpt = green;
  41. if ( display == on, interact( list( axes, cb, sb ) ) );
  42. drawctlpt = 0;
  43.  
  44. #
  45. # Curve refinement.
  46. #
  47. cb_ref = crefine( cb, false, list( 0.25, 0.5, 0.75 ) );
  48. color( cb_ref, yellow );
  49. if ( display == on, interact( list( axes, cb, cb_ref ) ) );
  50. free( cb_ref );
  51.  
  52. #
  53. # Knot substitution (One internal knot is moved from 0.1 to 0.9).
  54. #
  55. cb_ref = crefine( cb, false, list( 0.5 ) );
  56. cb_all = list( axes );
  57. for ( t = 0.1, 0.1, 0.9,
  58.     cb1 = crefine( cb_ref, true, list( 0, 0, 0, t, 1, 1, 1 ) ):
  59.     color( cb1, green ):
  60.     snoc( cb1, cb_all )
  61.     );
  62. if ( display == on, interact( cb_all ) );
  63. free( cb_all );
  64.  
  65. #
  66. # Curve subdivision.
  67. #
  68. cb_lst = cdivide( cb, 0.5 );
  69. cb1 = nth( cb_lst, 1 );
  70. color( cb1, green );
  71. cb2 = nth( cb_lst, 2 );
  72. color( cb2, yellow );
  73. free( cb_lst );
  74. if ( display == on, interact( list( axes, cb, cb1, cb2 ) ) );
  75. free( cb1 );
  76. free( cb2 );
  77.  
  78. #
  79. # Region from curve.
  80. #
  81. cbr1 = cregion( cb, 0.3, 0.6 );
  82. color( cbr1, yellow );
  83. cbr2 = cregion( cb, 0.5, 1.0 );
  84. color( cbr2, green );
  85. cbr3 = cregion( cb, 0.3, 0.0 );
  86. color( cbr3, blue );
  87. if ( display == on, interact( list( cb, cbr1, cbr2, cbr3 ) ) );
  88. free( cbr1 ); free( cbr2 ); free( cbr3 );
  89.  
  90. #
  91. # Surface subdivision and merging.
  92. #
  93. sb_lst = sdivide( sb, COL, 1.4 );
  94. sb1 = nth( sb_lst, 1 );
  95. color( sb1, green );
  96. sb2 = nth( sb_lst, 2 );
  97. color( sb2, yellow );
  98. free( sb_lst );
  99. if ( display == on, interact( list( axes, sb, sb1, sb2 ) ) );
  100. sbm = smerge( sb1, sb2, COL, 1 );
  101. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  102. sbm = smerge( sb1 * trans( vector( 0.0, -0.5, 0.0 ) ),
  103.           sb2 * trans( vector( 0.0,  0.5, 0.0 ) ), COL, 0 );
  104. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  105. free( sb1 );
  106. free( sb2 );
  107.  
  108. sb_lst = sdivide( sb, ROW, 4.8 );
  109. sb1 = nth( sb_lst, 1 );
  110. color( sb1, green );
  111. sb2 = nth( sb_lst, 2 );
  112. color( sb2, yellow );
  113. free( sb_lst );
  114. if ( display == on, interact( list( axes, sb, sb1, sb2 ) ) );
  115. sbm = smerge( sb1, sb2, ROW, 1 );
  116. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  117. sbm = smerge( sb1 * trans(vector( -0.5, 0.0, 0.0 ) ),
  118.           sb2 * trans(vector(  0.5, 0.0, 0.0 ) ), ROW, 0 );
  119. if ( display == on, interact( list( axes, sbm, sb1, sb2 ) ) );
  120. free( sb1 );
  121. free( sb2 );
  122.  
  123. #
  124. # Region from surface.
  125. #
  126. sbr1 = sregion( sb, COL, 1.3, 1.6 );
  127. color( sbr1, yellow );
  128. sbr2 = sregion( sb, COL, 1.8, 2.0 );
  129. color( sbr2, green );
  130. sbr3 = sregion( sb, ROW, 4.0, 5.0 );
  131. color( sbr3, blue );
  132. interact( list( sb, sbr1, sbr2, sbr3 ) );
  133. free( sbr1 ); free( sbr2 ); free( sbr3 );
  134.  
  135. #
  136. # Derivative and normal curves/surfaces
  137. #
  138. drawctlpt = green;
  139. dcb = cderive( cb );
  140. if ( display == on, interact( list( axes, dcb, cb ) ) );
  141. dsb1 = sderive( sb, ROW );
  142. color( dsb1, magenta );
  143. dsb2 = sderive( sb, COL );
  144. color( dsb2, yellow );
  145. if ( display == on, interact( list( axes, dsb1, dsb2, sb ) ) );
  146. nsb = snrmlsrf( sb );
  147. color( nsb, yellow );
  148. if ( display == on, interact( list( axes, nsb, sb ) ) );
  149. free( dcb );
  150. free( scb1 );
  151. free( scb2 );
  152. free( ncb );
  153.  
  154.  
  155. #
  156. # Iso curves extraction from surface.
  157. #
  158. cb_all = list( axes );
  159. snoc( sb, cb_all );
  160. for ( t = 1.1, 0.1, 1.9,
  161.     cb1 = csurface( sb, COL, t ):
  162.     color( cb1, green ):
  163.     snoc( cb1, cb_all )
  164.     );
  165. for ( t = 3.1, 0.2, 5.9,
  166.     cb1 = csurface( sb, ROW, t ):
  167.     color( cb1, green ):
  168.     snoc( cb1, cb_all )
  169.     );
  170. if ( display == on, interact( cb_all ) );
  171. free( cb_all );
  172.  
  173.  
  174. #
  175. # curves extraction from surface mesh. Note curves may be not on the surface.
  176. #
  177. cb_all = list( axes );
  178. snoc( sb, cb_all );
  179. for ( t = 0, 1, 2,
  180.     cb1 = cmesh( sb, COL, t ):
  181.     color( cb1, green ):
  182.     snoc( cb1, cb_all )
  183.     );
  184. for ( t = 0, 1, 4,
  185.     cb1 = cmesh( sb, ROW, t ):
  186.     color( cb1, green ):
  187.     snoc( cb1, cb_all )
  188.     );
  189. drawctlpt = green;
  190. if ( display == on, interact( cb_all ) );
  191. drawctlpt = 0;
  192. free( cb_all );
  193.  
  194. #
  195. # convert into polygons/polylines (using default resolution).
  196. #
  197. dumplvl = 1;
  198. resolution;
  199.  
  200. p = gpolyline( list( sb, cb ) );
  201. if ( display == on, interact( list( p, axes ) ) );
  202.  
  203. p = gpolygon( sb );
  204. if ( display == on, viewstate("DrawVNrml"):
  205.             interact( list( p, axes ) ):
  206.             viewstate("DrawVNrml") );
  207.  
  208. #
  209. # reverse surface ( flip normals ).
  210. #
  211. q = gpolygon( -sb );
  212. if ( display == on, viewstate("DrawVNrml"):
  213.             interact( list( q, axes ) ):
  214.             viewstate("DrawVNrml") );
  215.  
  216. free(p);
  217. free(q);
  218.  
  219. #
  220. # Offset approximation by translation of srf/crv in normal direction.
  221. #
  222. cbo = offset(cb, 0.1);
  223. if ( display == on, interact( list( axes, cb, cbo ) ) );
  224. free(cbo);
  225.  
  226. sbo = offset(sb, 0.2);
  227. if ( display == on, interact( list( axes, sb, sbo ) ) );
  228. free(sbo);
  229.  
  230. #
  231. # Surface and Curve evaluation.
  232. #
  233. ceval( cb, 0.0 );
  234. ceval( cb, 0.1 );
  235. ceval( cb, 0.3 );
  236. ceval( cb, 0.5 );
  237. ceval( cb, 0.9 );
  238. ceval( cb, 1.0 );
  239. ceval( cb, -0.3 );
  240.  
  241. pause(1);
  242.  
  243. seval( sb, 1.0, 3.0 );
  244. seval( sb, 1.1, 3.0 );
  245. seval( sb, 1.3, 3.0 );
  246. seval( sb, 1.5, 3.5 );
  247. seval( sb, 1.9, 3.1 );
  248. seval( sb, 1.0, 4.0 );
  249. seval( sb, 1.5, 4.0 );
  250. seval( sb, 0.5, 4.0 );
  251.  
  252. pause(1);
  253.  
  254. #
  255. #
  256. # Surface and Curve tangents.
  257. #
  258. ctangent( cb, 0.0 );
  259. ctangent( cb, 0.1 );
  260. ctangent( cb, 0.3 );
  261. ctangent( cb, 0.5 );
  262. ctangent( cb, 0.9 );
  263. ctangent( cb, 1.0 );
  264.  
  265. pause(1);
  266.  
  267. stangent( sb, ROW, 1.0, 3.0 );
  268. stangent( sb, COL, 1.1, 3.0 );
  269. stangent( sb, ROW, 1.3, 3.0 );
  270. stangent( sb, COL, 1.5, 3.5 );
  271. stangent( sb, ROW, 1.9, 3.1 );
  272. stangent( sb, COL, 1.0, 4.0 );
  273. stangent( sb, COL, 1.5, 4.0 );
  274.  
  275. #
  276. #
  277. # Surface normals.
  278. #
  279. snormal( sb, 1.0, 3.0 );
  280. snormal( sb, 1.1, 3.0 );
  281. snormal( sb, 1.3, 3.0 );
  282. snormal( sb, 1.5, 3.5 );
  283. snormal( sb, 1.9, 3.1 );
  284. snormal( sb, 1.0, 4.0 );
  285. snormal( sb, 1.5, 4.0 );
  286.  
  287. pause(1);
  288.  
  289. #
  290. # save("cb", cb);
  291. # save("sb", sb);
  292. #
  293. # cb1 = load("cb.crv");
  294. # sb1 = load("sb.srf");
  295. #
  296. # save("cb1", cb1);
  297. # save("sb1", sb1);
  298. #